{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "OH1hh3sqmI39"
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "%reload_ext autoreload\n",
    "%autoreload 2\n",
    "%config InlineBackend.figure_format = 'retina'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "qvMXmSSHoHW_"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/DBetancourt/anaconda3/envs/tensorflow_p37/lib/python3.7/site-packages/sklearn/externals/joblib/__init__.py:15: DeprecationWarning: sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23. Please import this functionality directly from joblib, which can be installed with: pip install joblib. If this warning is raised when loading pickled models, you may need to re-serialize those models with scikit-learn 0.21+.\n",
      "  warnings.warn(msg, category=DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from scipy.stats import expon, randint\n",
    "from sklearn.utils.testing import ignore_warnings\n",
    "from sklearn.exceptions import ConvergenceWarning\n",
    "from sklearn.externals import joblib\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV, RandomizedSearchCV\n",
    "\n",
    "from sklearn.decomposition import KernelPCA, PCA\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import data_cleaning "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "ename": "ImportError",
     "evalue": "Unable to find a usable engine; tried using: 'pyarrow', 'fastparquet'.\npyarrow or fastparquet is required for parquet support",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mImportError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-4-a21109782f30>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0;31m# Load raw data\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;31m# X_data_all = pd.read_parquet('df_all_61.parquet', columns=feats_preselect.append('csv_name'))\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mX_data_all\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_parquet\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'df_all_61.parquet'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      4\u001b[0m \u001b[0;31m# X_data_all = pd.read_parquet('df_all_61.parquet', columns=feats_preselect)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_data_all\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/tensorflow_p37/lib/python3.7/site-packages/pandas/io/parquet.py\u001b[0m in \u001b[0;36mread_parquet\u001b[0;34m(path, engine, columns, **kwargs)\u001b[0m\n\u001b[1;32m    293\u001b[0m     \"\"\"\n\u001b[1;32m    294\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 295\u001b[0;31m     \u001b[0mimpl\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    296\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mimpl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/tensorflow_p37/lib/python3.7/site-packages/pandas/io/parquet.py\u001b[0m in \u001b[0;36mget_engine\u001b[0;34m(engine)\u001b[0m\n\u001b[1;32m     30\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     31\u001b[0m         raise ImportError(\n\u001b[0;32m---> 32\u001b[0;31m             \u001b[0;34m\"Unable to find a usable engine; \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     33\u001b[0m             \u001b[0;34m\"tried using: 'pyarrow', 'fastparquet'.\\n\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     34\u001b[0m             \u001b[0;34m\"pyarrow or fastparquet is required for parquet \"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mImportError\u001b[0m: Unable to find a usable engine; tried using: 'pyarrow', 'fastparquet'.\npyarrow or fastparquet is required for parquet support"
     ]
    }
   ],
   "source": [
    "# Load raw data \n",
    "# X_data_all = pd.read_parquet('df_all_61.parquet', columns=feats_preselect.append('csv_name'))\n",
    "X_data_all = pd.read_parquet('df_all_61.parquet')\n",
    "# X_data_all = pd.read_parquet('df_all_61.parquet', columns=feats_preselect)\n",
    "print(X_data_all.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(305976, 1285)\n"
     ]
    }
   ],
   "source": [
    "# data cleaning module deletes columns with all nan or 0s \n",
    "# can add more data cleaning checks as needed\n",
    "\n",
    "dataset = data_cleaning.cleaner('df_all_61.parquet')\n",
    "print(dataset.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1112
    },
    "colab_type": "code",
    "id": "VXJo7_KaWCZs",
    "outputId": "0444ef6f-e4fd-499f-dfde-2cf28f721cc7"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3582, 387)\n",
      "issues counts e2e9c795-3996-11e9-9344-42010a8a0015    12\n",
      "09ea9e59-3996-11e9-83ad-42010a8a0061    12\n",
      "164db4f1-3996-11e9-b8ff-42010a8a002a    11\n",
      "efde8957-3996-11e9-b693-42010a8a002f    11\n",
      "295d4b0d-3996-11e9-a722-42010a8a0019    11\n",
      "e09d9abb-3996-11e9-9344-42010a8a0015    11\n",
      "4fb2d60b-3996-11e9-a729-42010a8a0019    11\n",
      "7ea4e30f-3996-11e9-9332-42010a8a0015    11\n",
      "15319259-3996-11e9-aa10-42010a8a0017    11\n",
      "f1a3257d-3995-11e9-b8f8-42010a8a002a    11\n",
      "8105d4b5-3996-11e9-8aa6-42010a8a004f    11\n",
      "e4fa365b-3995-11e9-8a7e-42010a8a004f    11\n",
      "df7ca446-3995-11e9-9ca6-42010a8a0059    11\n",
      "14c1ad68-3996-11e9-b396-42010a8a0026    11\n",
      "e01ccb60-3995-11e9-b390-42010a8a0026    11\n",
      "47b0938d-3996-11e9-9328-42010a8a0015    11\n",
      "980dfbc9-3996-11e9-9336-42010a8a0015    10\n",
      "e325b629-3996-11e9-93a2-42010a8a005d    10\n",
      "fd55b92f-3996-11e9-9347-42010a8a0015    10\n",
      "1a2c2c9b-3996-11e9-b66f-42010a8a0060    10\n",
      "8141e561-3996-11e9-938b-42010a8a005d    10\n",
      "4c902553-3996-11e9-9757-42010a8a002e    10\n",
      "5f59dc67-3996-11e9-83c1-42010a8a0061    10\n",
      "4cce6be7-3996-11e9-b684-42010a8a0060    10\n",
      "dc4581e1-3995-11e9-a713-42010a8a0019    10\n",
      "4fd43187-3996-11e9-9757-42010a8a002e    10\n",
      "8fd0882d-3996-11e9-9947-42010a8a0043    10\n",
      "e3393adb-3995-11e9-973c-42010a8a002e    10\n",
      "e10f9665-3995-11e9-88f6-42010a8a005a    10\n",
      "bd4735ef-3996-11e9-b91f-42010a8a002a    10\n",
      "                                        ..\n",
      "96306cc7-3996-11e9-8915-42010a8a005a     1\n",
      "1241288e-3996-11e9-9cad-42010a8a0059     1\n",
      "feb3c8cb-3995-11e9-9425-42010a8a0058     1\n",
      "5c34d66b-3996-11e9-b920-42010a8a0034     1\n",
      "768beb21-3996-11e9-b911-42010a8a002a     1\n",
      "b239662b-3996-11e9-891f-42010a8a005a     1\n",
      "75552916-3996-11e9-90c3-42010a8a000f     1\n",
      "78bfb5cb-3996-11e9-b1e3-42010a8a0062     1\n",
      "6db5a834-3996-11e9-be54-42010a8a005b     1\n",
      "87de6381-3996-11e9-83c9-42010a8a0061     1\n",
      "2f15e035-3996-11e9-b1d3-42010a8a0062     1\n",
      "2aaf8730-3996-11e9-974a-42010a8a002e     1\n",
      "456cf3af-3996-11e9-b918-42010a8a0034     1\n",
      "13399af5-3996-11e9-942c-42010a8a0058     1\n",
      "4911a096-3996-11e9-88e6-42010a8a000d     1\n",
      "b61fc1ae-3996-11e9-88f3-42010a8a000d     1\n",
      "f720a6a6-3995-11e9-973e-42010a8a002e     1\n",
      "b05ae57d-3996-11e9-9763-42010a8a002e     1\n",
      "5f23052d-3996-11e9-ad1a-42010a8a0002     1\n",
      "c6663fe8-3996-11e9-be6b-42010a8a005b     1\n",
      "8c568975-3996-11e9-b1e9-42010a8a0062     1\n",
      "fc96a707-3995-11e9-973f-42010a8a002e     1\n",
      "735d9d4b-3996-11e9-b926-42010a8a0034     1\n",
      "23799b77-3996-11e9-a0a9-42010a8a0069     1\n",
      "e235c197-3995-11e9-909c-42010a8a000f     1\n",
      "8402b8ed-3996-11e9-83c9-42010a8a0061     1\n",
      "2fecd699-3996-11e9-ad15-42010a8a0002     1\n",
      "e02ea10f-3995-11e9-8a7e-42010a8a004f     1\n",
      "af3621eb-3996-11e9-933d-42010a8a0015     1\n",
      "133ac85d-3996-11e9-9378-42010a8a005d     1\n",
      "Name: issue_id, Length: 314, dtype: int64\n",
      "[3582, 1, 1, 1, 1, 1, 1, 1, 1745, 1641, 1023, 2082, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 7, 7, 3, 2590, 1435, 751, 3334, 8, 1, 166, 70, 47, 591, 1, 85, 39, 18, 223, 39, 17, 11, 95, 3393, 3297, 1963, 3403, 979, 685, 649, 1393, 1333, 1331, 1263, 1403, 3186, 2903, 2106, 3403, 1, 1, 1, 3271, 3028, 1322, 3410, 1060, 965, 404, 1060, 1, 1, 1, 7, 923, 888, 8, 918, 743, 8, 3463, 2, 2, 2, 27, 7, 4, 42, 68, 53, 11, 328, 1275, 911, 898, 1450, 990, 903, 17, 983, 864, 220, 1, 1, 43, 27, 3, 21, 45, 30, 3, 21, 48, 33, 3, 21, 48, 33, 3, 21, 1117, 1026, 425, 1281, 628, 548, 261, 682, 48, 33, 3, 21, 58, 54, 3, 2126, 1584, 729, 3286, 20, 43, 30, 3, 21, 218, 185, 69, 198, 42, 42, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 2, 2, 5, 1570, 210, 42, 38, 193, 182, 33, 22, 154, 153, 33, 17, 135, 157, 33, 16, 141, 2027, 1923, 1577, 2046, 1780, 1730, 1490, 1728, 1445, 1435, 1402, 1429, 1539, 1527, 1426, 1500, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 2, 2, 5, 7, 4, 2, 6, 22, 18, 4, 7, 1, 1, 1, 2, 2, 2, 2, 1, 5, 480, 1, 1, 1, 1, 1, 1, 7, 4, 2, 6, 1, 1, 1, 21, 18, 4, 9, 30, 2, 1, 2, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3490, 507, 41, 34, 498, 464, 39, 37, 453, 602, 52, 38, 590, 624, 47, 48, 608, 3542, 3511, 3101, 3540, 3541, 3520, 2601, 3540, 1024, 31, 43, 968, 3478, 3435, 2308, 3542, 3514, 3238, 3540, 3458, 350, 44, 10, 348, 3488, 3476, 2326, 3464, 3477, 3433, 2301, 3458, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1093, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 315]\n"
     ]
    }
   ],
   "source": [
    "# data cleaning module deletes columns with all nan or 0s \n",
    "# can add more datacleaning checks later\n",
    "\n",
    "dataset = data_cleaning.cleaner(PROJ_PATH+\"/data.csv\")\n",
    "print(dataset.shape)\n",
    "\n",
    "# this is just some data exploration\n",
    "issues = dataset.issue_id.unique()  # 315 issues\n",
    "issues_counts = dataset.issue_id.value_counts()\n",
    "print(\"issues counts\",issues_counts)\n",
    "\n",
    "# print number of unique values per column\n",
    "num_issues = []\n",
    "for i in range(dataset.shape[1]):\n",
    "\tn_issues = len(dataset.iloc[:,i].unique())\n",
    "\tnum_issues.append(n_issues) \n",
    "\n",
    "print(num_issues)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "8atxLdU9aWIv"
   },
   "outputs": [],
   "source": [
    "# after cleaning the data we're ready to encode it categorical features and the labels\n",
    "data_encoding = SourceFileLoader('encoding', join(PROJ_PATH, 'data_encoding.py')).load_module()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "4SeIz8DueUiT"
   },
   "outputs": [],
   "source": [
    "# load the encoded data \n",
    "X_data_enc, y_data_enc = data_encoding.data_enc(dataset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Ew1hAObuf_3o"
   },
   "outputs": [],
   "source": [
    "# Do some nan imputation. There's a large number of nans and cannot do dimensionality reduction with them.\n",
    "# X_data_enc_clean = X_data_enc.fillna(value=0)  # naive \n",
    "X_data_enc_clean = X_data_enc.fillna(method='ffill')\n",
    "X_data_enc_clean.fillna(value=0, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "pGo0E2Yl9s6S"
   },
   "outputs": [],
   "source": [
    "# Scale the data \n",
    "X_data_enc_std = StandardScaler().fit_transform(X_data_enc_clean)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 244
    },
    "colab_type": "code",
    "id": "ivW3QRmIgSuy",
    "outputId": "8f125ee4-2ce5-4aa4-b6fd-e5c188f98042"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>timestamp</th>\n",
       "      <th>cluster_id</th>\n",
       "      <th>cluster_name</th>\n",
       "      <th>customer_id</th>\n",
       "      <th>service</th>\n",
       "      <th>batch_remove_batch_remove_dropped_var</th>\n",
       "      <th>batch_store_batch_store_dropped_var</th>\n",
       "      <th>blocked_anti_entropy_var</th>\n",
       "      <th>blocked_compactions_var</th>\n",
       "      <th>blocked_counter_writes_var</th>\n",
       "      <th>...</th>\n",
       "      <th>write_serial_timeouts_count_var</th>\n",
       "      <th>write_serial_unavailables_count_var</th>\n",
       "      <th>write_three_failures_count_var</th>\n",
       "      <th>write_three_timeouts_count_var</th>\n",
       "      <th>write_three_unavailables_count_var</th>\n",
       "      <th>write_timeouts_count_var</th>\n",
       "      <th>write_two_failures_count_var</th>\n",
       "      <th>write_two_timeouts_count_var</th>\n",
       "      <th>write_two_unavailables_count_var</th>\n",
       "      <th>write_unavailables_count_var</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 385 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   timestamp  cluster_id  cluster_name  customer_id  service  \\\n",
       "0        0.0         1.0           1.0          0.0      0.0   \n",
       "1        1.0         1.0           1.0          0.0      0.0   \n",
       "2        2.0         1.0           1.0          0.0      0.0   \n",
       "3        3.0         1.0           1.0          0.0      0.0   \n",
       "4        4.0         1.0           1.0          0.0      0.0   \n",
       "\n",
       "   batch_remove_batch_remove_dropped_var  batch_store_batch_store_dropped_var  \\\n",
       "0                                    0.0                                  0.0   \n",
       "1                                    0.0                                  0.0   \n",
       "2                                    0.0                                  0.0   \n",
       "3                                    0.0                                  0.0   \n",
       "4                                    0.0                                  0.0   \n",
       "\n",
       "   blocked_anti_entropy_var  blocked_compactions_var  \\\n",
       "0                       0.0                      0.0   \n",
       "1                       0.0                      0.0   \n",
       "2                       0.0                      0.0   \n",
       "3                       0.0                      0.0   \n",
       "4                       0.0                      0.0   \n",
       "\n",
       "   blocked_counter_writes_var              ...               \\\n",
       "0                         0.0              ...                \n",
       "1                         0.0              ...                \n",
       "2                         0.0              ...                \n",
       "3                         0.0              ...                \n",
       "4                         0.0              ...                \n",
       "\n",
       "   write_serial_timeouts_count_var  write_serial_unavailables_count_var  \\\n",
       "0                              0.0                                  0.0   \n",
       "1                              0.0                                  0.0   \n",
       "2                              0.0                                  0.0   \n",
       "3                              0.0                                  0.0   \n",
       "4                              0.0                                  0.0   \n",
       "\n",
       "   write_three_failures_count_var  write_three_timeouts_count_var  \\\n",
       "0                             0.0                             0.0   \n",
       "1                             0.0                             0.0   \n",
       "2                             0.0                             0.0   \n",
       "3                             0.0                             0.0   \n",
       "4                             0.0                             0.0   \n",
       "\n",
       "   write_three_unavailables_count_var  write_timeouts_count_var  \\\n",
       "0                                 0.0                       0.0   \n",
       "1                                 0.0                       0.0   \n",
       "2                                 0.0                       0.0   \n",
       "3                                 0.0                       0.0   \n",
       "4                                 0.0                       0.0   \n",
       "\n",
       "   write_two_failures_count_var  write_two_timeouts_count_var  \\\n",
       "0                           0.0                           0.0   \n",
       "1                           0.0                           0.0   \n",
       "2                           0.0                           0.0   \n",
       "3                           0.0                           0.0   \n",
       "4                           0.0                           0.0   \n",
       "\n",
       "   write_two_unavailables_count_var  write_unavailables_count_var  \n",
       "0                               0.0                           0.0  \n",
       "1                               0.0                           0.0  \n",
       "2                               0.0                           0.0  \n",
       "3                               0.0                           0.0  \n",
       "4                               0.0                           0.0  \n",
       "\n",
       "[5 rows x 385 columns]"
      ]
     },
     "execution_count": 68,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_data_enc_clean.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "xK6p3qLEhww0"
   },
   "outputs": [],
   "source": [
    "# load the dimensionality reduction mudule\n",
    "# here we examine by hand, which features make the most sense, and also test them out with a \n",
    "# classifier\n",
    "dim_red = SourceFileLoader('dimred', join(PROJ_PATH, 'dim_red.py')).load_module()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 294
    },
    "colab_type": "code",
    "id": "XZ4Qzgm-ItbV",
    "outputId": "362d7df8-34f9-426f-b7e1-0b07b32b0c52"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "image/png": {
       "height": 277,
       "width": 390
      },
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# do some exploration first\n",
    "pca = PCA().fit(X_data_enc_std)\n",
    "#Plotting the Cumulative Summation of the Explained Variance\n",
    "plt.figure()\n",
    "plt.plot(np.cumsum(pca.explained_variance_ratio_))\n",
    "plt.xlabel('Number of Components')\n",
    "plt.ylabel('Sum of Explaied Variance (%)') # for each component\n",
    "plt.title('Explained Variance')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 104
    },
    "colab_type": "code",
    "id": "vpODgM1JkJLg",
    "outputId": "15675dc7-b711-40dd-a4b0-d5fffd590548"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.6/dist-packages/sklearn/discriminant_analysis.py:388: UserWarning:\n",
      "\n",
      "Variables are collinear.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "X_pca, X_kpca, X_rp, X_lda = dim_red.dim_reduction(pd.DataFrame(X_data_enc_std), y_data_enc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "id": "EJnfSOxrlPmm",
    "outputId": "13faa6de-dd53-4fb9-d6a2-46286f02aed2"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3582, 40)"
      ]
     },
     "execution_count": 19,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_pca.shape\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "op0wMcA8c2pq"
   },
   "source": [
    "The cells below are not necessary for dimensionality reduction. They only assess the reduced dataset with a learner."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "EtoHLSGdgWwi"
   },
   "outputs": [],
   "source": [
    "# split the data into training and testing\n",
    "def ts_split(dataset, train_perc):\n",
    "    # dataset is a dataframe\n",
    "    train_size = int(len(dataset) * train_perc)\n",
    "    test_size = len(dataset) - train_size\n",
    "    train, test = dataset.iloc[0:train_size,:], dataset.iloc[train_size:len(dataset),:]\n",
    "    return train, test\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 50
    },
    "colab_type": "code",
    "id": "voZ2apA0nkT5",
    "outputId": "fd38c67b-cb07-409d-cc98-e7f3e419f37a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2507, 40)\n",
      "(1075, 40)\n"
     ]
    }
   ],
   "source": [
    "# split the reduced dataset\n",
    "dataset = pd.concat([pd.DataFrame(X_pca), pd.DataFrame(y_data_enc)],axis=1)\n",
    "train, test = ts_split(dataset, 0.7)\n",
    "X_train, y_train = train.iloc[:,:-1], train.iloc[:,-1]\n",
    "X_test, y_test = test.iloc[:,:-1], test.iloc[:,-1]\n",
    "print(X_train.shape)\n",
    "print(X_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 50
    },
    "colab_type": "code",
    "id": "0k_wIqMTbScs",
    "outputId": "063dabb4-a5bc-4221-d890-a1941844180c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2507, 385)\n",
      "(1075, 385)\n"
     ]
    }
   ],
   "source": [
    "# split the original training set\n",
    "orig_data = pd.concat([pd.DataFrame(X_data_enc_std), pd.DataFrame(y_data_enc)], axis=1)\n",
    "train_org, test_org = ts_split(orig_data, 0.7)\n",
    "X_train_org, y_train_org = train_org.iloc[:,:-1], train_org.iloc[:,-1]\n",
    "X_test_org, y_test_org = test_org.iloc[:,:-1], test_org.iloc[:,-1]\n",
    "print(X_train_org.shape)\n",
    "print(X_test_org.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "id": "930tO1InplX5",
    "outputId": "b45dddf7-8eb9-4788-e761-c9dd7c2658bd"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6509772636617471\n"
     ]
    }
   ],
   "source": [
    "# test some simple learners with reduced data\n",
    "rf_clf = RandomForestClassifier(n_estimators=200, max_depth=3, \n",
    "\t\t       random_state=500)\n",
    "rf_clf.fit(X_train, y_train)\n",
    "rf_score = rf_clf.score(X_train,y_train)\n",
    "feat_importances = rf_clf.feature_importances_\n",
    "\n",
    "print(rf_score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "id": "oVAN9UWpdjWa",
    "outputId": "978c29d5-9962-47fc-ed0d-b35ee3d5a1c2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6980454726765057\n"
     ]
    }
   ],
   "source": [
    "# test some simple learners with original data\n",
    "rf_clf = RandomForestClassifier(n_estimators=2000, max_depth=3, \n",
    "\t\t       random_state=500)\n",
    "rf_clf.fit(X_train_org, y_train_org)\n",
    "rf_score = rf_clf.score(X_train_org,y_train_org)\n",
    "feat_importances = rf_clf.feature_importances_\n",
    "\n",
    "print(rf_score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "id": "IhWlaBAlUmuz",
    "outputId": "6884890b-6d77-41bf-e2f1-0764e9089c27"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras.models import Sequential\n",
    "from keras.layers.core import Dense, Dropout, Activation\n",
    "from keras.optimizers import RMSprop, Adam\n",
    "from keras.layers import LSTM\n",
    "from keras.models import load_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "id": "71JZ4Mh0ez_i",
    "outputId": "aae88eb6-9952-43c3-af35-03a19795fbf5"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2507, 40)"
      ]
     },
     "execution_count": 36,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "hs0ESsJpeGTF"
   },
   "outputs": [],
   "source": [
    "# reshape feature data for LSTM\n",
    "n_steps = 1\n",
    "X_train_lstm = np.reshape(X_train.values, (X_train.shape[0], 1, X_train.shape[1]))\n",
    "X_test_lstm = np.reshape(X_test.values, (X_test.shape[0], n_steps, X_test.shape[1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "HaOFiJGyWkFf"
   },
   "outputs": [],
   "source": [
    "def build_model(feats_dim, optimizer='rmsprop', init='glorot_uniform'):        \n",
    "    model = Sequential()  \n",
    "    num_classes = 2 \n",
    "    model.add(LSTM(64, return_sequences=True, stateful=False, \n",
    "                   input_shape=(1, feats_dim)))\n",
    "    model.add(Dropout(0.5))\n",
    "    model.add(LSTM(64, return_sequences=True,\n",
    "                       stateful=False))\n",
    "    model.add(Dropout(0.5))\n",
    "    model.add(LSTM(64, return_sequences=True,\n",
    "                       stateful=False))\n",
    "    model.add(LSTM(64, stateful=False))\n",
    "    model.add(Dropout(0.5)) \n",
    "    model.add(Dense(num_classes, kernel_initializer=init))\n",
    "    model.add(Activation('softmax')) \n",
    "    model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])\n",
    "    return model "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "jzq8yjtMa5lm"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "name": "Dim_reduction.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
